package com.jch.mp.manner2;

import com.jch.mp.manner1.codec.MsgDecoder;
import com.jch.mp.manner1.codec.MsgEncoder;
import com.jch.mp.manner1.server.ComplexMessageHandler;
import com.jch.mp.manner1.server.GroupMessageHandler;
import com.jch.mp.manner1.server.SimpleMessageHandler;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

import java.nio.charset.StandardCharsets;
import java.util.List;

public class ChooseProtocolDecoder extends ByteToMessageDecoder {

    // WebSocket 协议前缀
    private static final String WEBSOCKET_PROTOCOL_PREFIX = "GET ws://";

    // 检查字节长度 用于判断是否为自定义TCP协议 | http 协议中带有空格
//    private static final int CHECK_LENGTH = 10;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
//        if (isWebSocket(in)) {
//            ctx.pipeline().addLast("http-codec", new HttpServerCodec());
//            ctx.pipeline().addLast("aggregator", new HttpObjectAggregator(65336));
//            ctx.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
//            ctx.pipeline().addLast("WebSocket", new WebSocketServerProtocolHandler("/websocket"));
//            // 自定义处理器
//            ctx.pipeline().addLast(new Manner2WebSocketServerHandler());
//        } else if (isCustomize(in)) {
//            // 解码器
//            ctx.pipeline().addLast(new MsgDecoder());
//            // 编码器
//            ctx.pipeline().addLast(new MsgEncoder());
//
//            // 处理器 自定义
//            ctx.pipeline().addLast(new SimpleMessageHandler());
//            ctx.pipeline().addLast(new GroupMessageHandler());
//            ctx.pipeline().addLast(new ComplexMessageHandler());
//        } else {
//            ctx.pipeline().addLast(new HttpResponseEncoder());
//            ctx.pipeline().addLast(new HttpRequestDecoder());
//
//            // 自定义处理器
//            ctx.pipeline().addLast(new HttpServerHandler());
//        }

        if (isCustomize(in)) {
            ctx.pipeline().addLast(new MsgDecoder()); // 自定义消息解码器
            ctx.pipeline().addLast(new MsgEncoder()); // 自定义消息编码器
            // 自定义 处理器
            ctx.pipeline().addLast(new SimpleMessageHandler());
            ctx.pipeline().addLast(new GroupMessageHandler());
            ctx.pipeline().addLast(new ComplexMessageHandler());
        }else {
            ctx.pipeline().addLast(new HttpServerCodec()); // http Request 解码器 | http Response 编码器
            ctx.pipeline().addLast(new ChunkedWriteHandler()); // 处理大数据流分块
            ctx.pipeline().addLast(new HttpObjectAggregator(512 * 1024)); // 自动分块处理
            ctx.pipeline().addLast(new WebSocketServerProtocolHandler("/websocket")); // 增加websocket支持
            // http 请求处理 自定义
            ctx.pipeline().addLast(new HttpServerHandler());
            // websocket 请求处理 自定义
            ctx.pipeline().addLast(new Manner2WebSocketServerHandler());
        }

        ctx.pipeline().remove(this); // 移除协议选择器
    }

    // 检查是否为自定义TCP协议 | 检查固定标识
    private boolean isCustomize(ByteBuf in) {
        in.markReaderIndex();
        int flag = in.readInt();
        in.resetReaderIndex();
        return flag == 9527;
    }

    // 检查是否为WebSocket 协议请求
    private boolean isWebSocket(ByteBuf in) {
        if (in.readableBytes() < WEBSOCKET_PROTOCOL_PREFIX.length()) {
            return false;
        }
        in.markReaderIndex();
        byte[] prefix = new byte[WEBSOCKET_PROTOCOL_PREFIX.length()];
        in.readBytes(prefix);
        in.resetReaderIndex(); // 重置读标记
        String prefixStr = new String(prefix, StandardCharsets.UTF_8);
        return WEBSOCKET_PROTOCOL_PREFIX.equals(prefixStr);
    }

}
